package Exercise;

/**
 * 有三个线程，分别只能打印A，B和C
 *
 * 要求按顺序打印ABC，打印10次
 *
 * 输出示例：
 *
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 */

//public class Demo1 {
//    static Object locker1=new Object();
//    static Object locker2=new Object();
//    static Object locker3=new Object();
//
//    public static void main(String[] args) throws InterruptedException {
//        Thread A=new Thread(()->{
//            for(int i=0;i<10;i++){
//                synchronized (locker1){
//                    try {
//                        locker1.wait();
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    System.out.print("A");
//                }
//                synchronized (locker2){
//                    locker2.notify();
//                }
//            }
//
//
//
//
//        });
//        Thread B=new Thread(()->{
//            for(int i=0;i<10;i++){
//                synchronized (locker2){
//                    try {
//                        locker2.wait();
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    System.out.print("B");
//                }
//                synchronized (locker3){
//                    locker3.notify();
//                }
//            }
//
//        });
//        Thread C=new Thread(()->{
//            for(int i=0;i<10;i++){
//                synchronized (locker3){
//                    try {
//                        locker3.wait();
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    System.out.print("C");
//                    System.out.println();
//                }
//                synchronized (locker1){
//                    locker1.notify();
//                }
//            }
//
//        });
//
//        A.start();
//        B.start();
//        C.start();
//
//        Thread.sleep(1000);
//        synchronized (locker1){
//            locker1.notify();
//        }
//
//
//    }
//
//
//
//}


public class Demo1 {
    //3把锁
    static Object locker1=new Object();
    static Object locker2=new Object();
    static Object locker3=new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread A=new Thread(()->{
                synchronized (locker1){
                    for(int i=0;i<10;i++){
                        try {
                            locker1.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.print("A");
                        synchronized (locker2){
                            locker2.notify();
                        }
                    }
                }
        });
        Thread B=new Thread(()->{
                synchronized (locker2){
                    for(int i=0;i<10;i++){
                        try {
                            locker2.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.print("B");
                        synchronized (locker3){
                            locker3.notify();
                        }
                    }

                }

        });
        Thread C=new Thread(()->{
                synchronized (locker3){
                    for(int i=0;i<10;i++){
                        try {
                            locker3.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.print("C");
                        System.out.println();
                        synchronized (locker1){
                            locker1.notify();
                        }

                    }

                }


        });

        A.start();
        B.start();
        C.start();

        Thread.sleep(1000);
        synchronized (locker1){
            locker1.notify();
        }




    }



}
